## 用于批处理运行程序，不支持房间仿真，仅支持实录

import os
import numpy as np

test_method = [14]
## 需要测试的算法 ##
#  1 -- MNMF
#  2 -- FastMNMF
#  3 -- MNMF_DP
#  4 -- FastMNMF_DP
#  5 -- ILRMA
#  6 -- MNMF_DP_Part
#  7 -- MNMF_Part
#  8 -- FastMNMF_Part
#  9 -- MNMF_DP_online
#  10 -- MNMF_online
#  11 -- FastMNMF_online
#  12 -- FastMNMF2_online
#  13 -- FastMNMF_DP_part
#  14 -- FastMNMF_DP_part_new

n_fft_case = [4096]      # fft点数
n_basis_case = [16]       # 基数目 default:16,64
n_source_case = [2]      # 源的个数
n_noise_case = [1]       # DP算法针对的噪声源个数
init_SCM_case = ['ILRMA'] # SCM初始化方式'obs','unit','ILRMA'
mode_update_Z_case = ['sampling']#['sampling','sampling2','backprop','backprop2','hybrid','hybrid2']  # 'sampling, sampling2, backprop, backprop2, hybrid, hybrid2'
n_Z_iteration_case = [30]  # default:30,45
gpu_id = -1

# 非DP算法在线参数
mini_batch_size_case = [4]  # lb大小
# DP算法在线参数
first_batch_size_DP_case = [50]  # 第一个batch大小
voice_frame_DP_case = [30]  # part算法选取离当前帧最近的帧数量

filepath = './/input//samples//'  # 定义输入音频文件路径
outpath = './/output//samples_new_init//'  # 定义输出音频文件路径
filelist = os.listdir(filepath) # 遍历文件夹所有的wav文件
file_wav_filt = filter(lambda filename:filename[-4:] == '.wav', filelist) #筛选出格式为.wav的文件
file_wav_list = list(file_wav_filt)

#循环遍历音频文件夹中wav格式文件
for i in range(len(file_wav_list)): 
    
    # 文件名获取及目录设置
    filename = file_wav_list[i][:-4]                # 获取文件名
    fileon = '.' + filepath + file_wav_list[i]      # 读取路径（相对于子目录）
    save_path = outpath + filename + '//'           # 保存路径（相对于主目录）
    save_path_rel = '.' + outpath + filename + '//' # 保存路径（相对于子目录）

    # 检查目录是否存在，在output文件夹中创建与当前读取音频同名文件夹，存放该音频的分离文件
    if not os.path.exists(save_path):
        print('folder not exist, create folder')
        os.mkdir(save_path)
    else:
        print('folder exist')

    # 非DP算法的批处理
    for n_fft in n_fft_case:
        for n_source in n_source_case:
            for n_basis in n_basis_case:
                for init_SCM in init_SCM_case:
                    for mini_batch_size in mini_batch_size_case:

                        # 运行如下命令执行MNMF算法
                        if 1 in test_method:
                            command_MNMF = 'python '+'MNMF.py '+fileon+' --save_path '+save_path_rel+' --n_source '+str(n_source)+\
                            ' --n_fft '+str(n_fft)+' --n_basis '+str(n_basis)+' --init_SCM '+init_SCM + ' --gpu '+str(gpu_id)
                            os.chdir('.//FullRank_Model//')
                            os.system(command_MNMF)
                            os.chdir('..//')

                        # 运行如下命令执行FastMNMF算法
                        if 2 in test_method:
                            command_FastMNMF = 'python '+'FastMNMF.py '+fileon+' --save_path '+save_path_rel+' --n_source '+str(n_source)+\
                            ' --n_fft '+str(n_fft)+' --n_basis '+str(n_basis)+' --init_SCM '+init_SCM + ' --gpu '+str(gpu_id)  #+' --dl_ratio '+str(dl_ratio)
                            os.chdir('.//Jointly_Diagonalizable_FullRank_Model//')
                            os.system(command_FastMNMF)
                            os.chdir('..//')

                        # 运行如下命令执行ILRMA算法
                        if init_SCM != 'ILRMA' and 5 in test_method:
                            command_ILRMA = 'python '+'ILRMA.py '+fileon+' --save_path '+save_path_rel+\
                            ' --n_fft '+str(n_fft)+' --n_basis '+str(n_basis)+' --init_SCM '+init_SCM + ' --gpu '+str(gpu_id)
                            os.chdir('.//Rank1_Model//')
                            os.system(command_ILRMA)
                            os.chdir('..//')

                        if 7 in test_method:
                            command_MNMF_part = 'python '+'MNMF_part.py '+fileon+' --save_path '+save_path_rel+' --n_source '+str(n_source)+\
                            ' --n_fft '+str(n_fft)+' --n_basis '+str(n_basis)+' --init_SCM '+init_SCM + ' --gpu '+str(gpu_id)
                            os.chdir('.//FullRank_Model//')
                            os.system(command_MNMF_part)
                            os.chdir('..//')

                        if 8 in test_method:
                            command_FastMNMF_part = 'python '+'FastMNMF_part.py '+fileon+' --save_path '+save_path_rel+' --n_source '+str(n_source)+\
                            ' --n_fft '+str(n_fft)+' --n_basis '+str(n_basis)+' --init_SCM '+init_SCM + ' --gpu '+str(gpu_id)
                            os.chdir('.//Jointly_Diagonalizable_FullRank_Model//')
                            os.system(command_FastMNMF_part)
                            os.chdir('..//')

                        if 10 in test_method:
                            command_MNMF_online = 'python '+'MNMF_online.py '+fileon+' --save_path '+save_path_rel+' --n_source '+str(n_source)+\
                            ' --n_fft '+str(n_fft)+' --n_basis '+str(n_basis)+' --init_SCM '+init_SCM + ' --gpu '+str(gpu_id)+' --mini_batch_size '+str(mini_batch_size)
                            os.chdir('.//FullRank_Model//')
                            os.system(command_MNMF_online)
                            os.chdir('..//')

                        if 11 in test_method:
                            command_FastMNMF_online = 'python '+'FastMNMF_online.py '+fileon+' --save_path '+save_path_rel+' --n_source '+str(n_source)+\
                            ' --n_fft '+str(n_fft)+' --n_basis '+str(n_basis)+' --init_SCM '+init_SCM + ' --gpu '+str(gpu_id)+' --mini_batch_size '+str(mini_batch_size)
                            os.chdir('.//Jointly_Diagonalizable_FullRank_Model//')
                            os.system(command_FastMNMF_online)
                            os.chdir('..//')

                        if 12 in test_method:
                            command_FastMNMF2_online = 'python '+'FastMNMF2_online.py '+fileon+' --save_path '+save_path_rel+' --n_source '+str(n_source)+\
                            ' --n_fft '+str(n_fft)+' --n_basis '+str(n_basis)+' --init_SCM '+init_SCM + ' --gpu '+str(gpu_id)+' --mini_batch_size '+str(mini_batch_size)
                            os.chdir('.//Jointly_Diagonalizable_FullRank_Model//')
                            os.system(command_FastMNMF2_online)
                            os.chdir('..//')

    # DP算法的批处理
    for n_noise in n_noise_case:
        for init_SCM in init_SCM_case:
            for mode_update_Z in mode_update_Z_case:
                for n_Z_iteration in n_Z_iteration_case:
                    for first_batch_size_DP in first_batch_size_DP_case:
                        for voice_frame_DP in voice_frame_DP_case:
                            # 运行如下命令执行MNMF_DP算法
                            if 3 in test_method:
                                command_MNMF_DP = 'python '+'MNMF_DP.py '+fileon+' --save_path '+save_path_rel+' --n_noise '+str(n_noise)+\
                                ' --init_SCM '+init_SCM+' --n_Z_iteration '+str(n_Z_iteration) + ' --gpu '+str(gpu_id)
                                os.chdir('.//FullRank_Model//')
                                os.system(command_MNMF_DP)
                                os.chdir('..//')

                            # 运行如下命令执行FastMNMF_DP算法
                            if 4 in test_method:
                                command_FastMNMF_DP = 'python '+'FastMNMF_DP.py '+fileon+' --save_path '+save_path_rel+' --n_noise '+str(n_noise)+\
                                ' --init_SCM '+init_SCM+' --mode_update_Z '+mode_update_Z+' --n_Z_iteration '+str(n_Z_iteration) + ' --gpu '+str(gpu_id)
                                os.chdir('.//Jointly_Diagonalizable_FullRank_Model//')
                                os.system(command_FastMNMF_DP)
                                os.chdir('..//')

                            # 运行如下命令执行MNMF_DP_Part算法
                            if 6 in test_method:
                                command_MNMF_DP_part = 'python '+'MNMF_DP_part.py '+fileon+' --save_path '+save_path_rel+' --n_noise '+str(n_noise)+\
                                ' --init_SCM '+init_SCM+' --n_Z_iteration '+str(n_Z_iteration) + ' --gpu '+str(gpu_id)+' --first_batch_size '+str(first_batch_size_DP)
                                os.chdir('.//FullRank_Model//')
                                os.system(command_MNMF_DP_part)
                                os.chdir('..//')

                            # 运行如下命令执行MNMF_DP_online算法
                            if 9 in test_method:
                                command_MNMF_DP_online = 'python '+'MNMF_DP_online.py '+fileon+' --save_path '+save_path_rel+' --n_noise '+str(n_noise)+\
                                ' --init_SCM '+init_SCM+' --n_Z_iteration '+str(n_Z_iteration) + ' --gpu '+str(gpu_id)+' --first_batch_size '+str(first_batch_size_DP)
                                os.chdir('.//FullRank_Model//')
                                os.system(command_MNMF_DP_online)
                                os.chdir('..//')

                            # 运行如下命令执行FastMNMF_DP_part算法
                            if 13 in test_method:
                                command_FastMNMF_DP_part = 'python '+'FastMNMF_DP_part.py '+fileon+' --save_path '+save_path_rel+' --n_noise '+str(n_noise)+ \
                                ' --init_SCM '+init_SCM+' --mode_update_Z '+mode_update_Z+' --n_Z_iteration '+str(n_Z_iteration) + ' --gpu '+str(gpu_id)+\
                                ' --first_batch_size '+str(first_batch_size_DP) + ' --voice_frame '+str(voice_frame_DP)
                                os.chdir('.//Jointly_Diagonalizable_FullRank_Model//')
                                os.system(command_FastMNMF_DP_part)
                                os.chdir('..//')

                            # 运行如下命令执行FastMNMF_DP_part_new算法
                            if 14 in test_method:
                                command_FastMNMF_DP_part_new = 'python '+'FastMNMF_DP_part_new.py '+fileon+' --save_path '+save_path_rel+' --n_noise '+str(n_noise)+\
                                ' --init_SCM '+init_SCM+' --mode_update_Z '+mode_update_Z+' --n_Z_iteration '+str(n_Z_iteration)+' --gpu '+str(gpu_id)+\
                                ' --voice_frame ' + str(voice_frame_DP)
                                os.chdir('.//Jointly_Diagonalizable_FullRank_Model//')
                                os.system(command_FastMNMF_DP_part_new)
                                os.chdir('..//')
